package main

// import "fmt"

// vscode 不支持 go module
func main() {
	// pointer
	// // 1. & 取地址
	// n := 18
	// fmt.Println(&n)
	// p := &n
	// fmt.Println(p)
	// fmt.Printf("%T\n", p) // *int: int类型的指针
	// // 2. * 根据地址取值
	// m := *p
	// fmt.Println(m)
	// fmt.Printf("%T\n", m) // int

	// new make
	// var a *int // 声明指针类型 nil pointer
	// 👆 <nil>
	// *a = 100   // 空的内存地址找不到值  更不可能赋值操作   赋值会报错
	// fmt.Println(*a)

	// new函数申请一个内存地址
	// // var a *int // 声明指针类型 nil pointer
	// // 👆 <nil>
	// var a = new(int)
	// // 👆 是一个内存地址 此时*a是一个int类型的0值
	// *a = 100
	// // 👆 *a 根据内存地址取值  然后赋值100
	// fmt.Println(*a)

	// make： make也是用于内存分配的，区别于new， 它只用于slice map 以及chan的
	// 内存创建，而且它返回的类型就是这三个类型本身，而不是他们的指针类型，因为
	// 这三种类型就是引用类型，所以就没有必要返回他们的指针了。make函数的函数签
	// 名如下：
	// func make(t Type, size ...IntegerType)Type

	/*
		make和new的区别
		1. make和new都是用来申请内存的
		2. new很少用，一般来说给基本数据类型申请内存，string\int，返回的是对应类型的指针（*string *int)
		3. make是用来给slice map chan 申请内存的，make函数返回的是对应的这三个类型本身
	*/

}
